import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static <T> T getProxy(T obj) {//泛型写法，属实奥里给
    //public static UserService getProxy(UserService obj) {
        //最后一点要转换为UserService返回，否则报错
       // return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(),//获取类加载器
        //一定要将代理返回的对象也转为泛型才行
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),//获取类加载器
                obj.getClass().getInterfaces(), new InvocationHandler() {           //获取类接口，重写方法InvocationHandler
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //Object proxy 被代理对象本身，一般不用
                        // Method method 正在被代理的方法
                        // Object[] args 获取到当前代理对象方法的参数
                        Long start = System.currentTimeMillis();
                        Object result =  method.invoke(obj,args);//使用Object返回方法执行后的结果
                        Long end = System.currentTimeMillis();
                        System.out.println("执行时间："+(end-start)/1000+"s");
                        return  result;
                    }
                });
    }
}
